package com.example.android2021.kt_02

import android.view.ViewGroup
import com.example.android2021.app.MyApp


class Toy2(protected var name:String) {

    var address = "jiaxing"
    var dog = Dog("zwj",24)

        
    // kuozhanhsnhu
    private fun String.cake(i:Int):Char{


        println("$address : is very good")
        dog.hello()
        return get(i)

    }


     fun Hello(){

        var cake = "zwj".cake(2)
        println(cake)


    }



}



val name: Jump2? = null

// 一般都要记得要在 name后面加上 问号?.
// 然后再调用let 扩展方法 {}
// 只有name字符串 不为空null 的时候，才会调用 let扩展方法
val length = name?.also {


    println("The name is $it")  // it 这个很常见，这里就是指 当前的字符串对象
                    // 这个就是最后一行代码，返回值 就是 当前的String字符串 的长度值
}




// apply 扩展函数
fun abc(): MutableList<String> {

    return mutableListOf<String>().also {
        it.add("aaa")
        it.add("222")
        it.add("333")

    }     // 返回的就是一个 ["111","222","333"] 已经初始化之后的 list可变集合对象
}



fun talk(a:Int,b:MyApp.()->Unit):Char{


    val myApp:MyApp = MyApp()
    b(myApp)

    return 'c'
}



fun main(){

// 因为 方法类型的参数，是最后一个位置，所以直接 用{} 了。并且配合 lambda表达式。
    var c = talk(20){
        onCreate()						// 传入的方法，可以直接调用 People类提供的 say()方法
    }
    println(c)					// 最后打印的是 my word is xixi ....


    val list2 = abc()
    println(list2)
    println(length) // 输出: 6



    var j = Jump2(10)
    j.jumpHigher(2) //输出 jump: 20 m

    var nums = arrayOf(1,2,3)

// 遍历数组,遍历数组下标
    for (i in 0..nums.size) {

        println("i下标的元素值： $nums[i]")
    }

    fun read(offset:Int, action:(x:Int) -> Int,start:Int):Int{

        return  action(offset)

    }

    var a = read(2, {
        it * 2
    }, 3
    )

    println("a的值 ： ${a}")

    println(Toy2("zwj").Hello())


    val intContainer: Container<Int> = GenericContainer()
    intContainer.add(1)
    intContainer.add(2)
    println(intContainer.getAll()) // 输出: [1, 2]


}

//  when后面 不带上 () ，就好比 if else
fun getGradeDescription(grade: Int): String {

    return when {
        grade >= 90 -> "Excellent"
        grade >= 80 -> "Good"
        grade >= 70 -> "Fair"
        grade >= 60 -> "Pass"
        else -> "Fail"         //when 最后一行必须要加 else
    }
}



fun <T> read(json: String, name: T): T? {
    return name
}

// 定义泛型接口
interface Container<T> {
    fun add(item: T)
    fun remove(item: T): Boolean
    fun getAll(): List<T>
}

// 实现 泛型接口。不指定类型
class GenericContainer<T> : Container<T> {
    private val items = mutableListOf<T>()

    override fun add(item: T) {
        items.add(item)
    }

    override fun remove(item: T): Boolean {
        return items.remove(item)
    }

    override fun getAll(): List<T> {
        return items
    }
}


class Box<T>(var content: T) {

    // 更新内容的方法
    fun updateContent(newContent: T) {
        content = newContent
    }

    // 比较内容的方法
    fun isEqualTo(otherContent: T): Boolean {
        return content == otherContent
    }

    // 打印内容的方法
    fun printContent() {
        println("Box contains: $content")
    }
}





class Jump2(var height:Int){

    fun test() {
        println("jump test")

    }
}

// 必须要加 已经存的类名.扩展方法名()
fun Jump2.jumpHigher(times: Int){

                                // 同时当然也可以直接调用 这个Jump类的所有方法 和 属性
    test()	                  // 也可以 this.test() ，这里的 this就指 Jump对象
    height = height * times
    println("jump: $height m")

}


val String.firstChar: Char get() = this.get(this.length - 1)













